
package com.lzx.adx.report.controller.v1.wifi;

import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.URLUtil;
import cn.hutool.crypto.SecureUtil;
import cn.hutool.http.HttpRequest;
import cn.hutool.http.HttpUtil;
import com.alibaba.fastjson.JSONObject;
import com.lzs.adx.commmon.utils.JsonUtils;
import com.lzs.adx.commmon.utils.Result;
import com.lzx.adx.report.bean.mapper.ReportMapper;
import com.lzx.adx.report.cache.AccountLocalCache;
import com.lzx.adx.report.dto.AccountDTO;
import com.lzx.adx.report.dto.ReportDTO;
import com.lzx.adx.report.enums.MeituEventTypeEnums;
import com.lzx.adx.report.enums.WifiEventTypeEnums;
import com.lzx.adx.report.model.common.CommonReportRequest;
import com.lzx.adx.report.model.meitu.request.MeituRequest;
import com.lzx.adx.report.model.wifi.WifiRequest;
import com.lzx.adx.report.service.ReportService;
import com.lzx.adx.report.util.UrlUtil;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletRequest;
import java.nio.charset.StandardCharsets;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 美图广告上报
 */
@RequestMapping("/wifi")
@RestController
@Slf4j
@RequiredArgsConstructor
public class WifiReportController {


    @Autowired
    private  ReportService reportService;

    @Autowired
    private  ThreadPoolTaskExecutor reportExecutor;

    @Autowired
    private  ReportMapper reportMapper;

    public static final   String apiDesc="wifi";




    @GetMapping("/report")
    public ResponseEntity report(WifiRequest wifiRequest, HttpServletRequest request){
       log.info("接收到【{}】的请求参数为{}",apiDesc, JsonUtils.toJsonString(wifiRequest));
       //1.收到监测的数据存储
        ReportDTO reportDTO=reportMapper.toReportDTO(wifiRequest);
        reportDTO.setBizRequestId(IdUtil.fastSimpleUUID()+reportDTO.getDspId());
        reportDTO.setCreateTime(new Date());
        reportDTO.setUpdateTime(new Date());
        reportDTO.setExtend(JsonUtils.toJsonString(wifiRequest));
        reportDTO.setTraceTime(String.valueOf(System.currentTimeMillis()/1000));
        reportExecutor.execute(()->{
            reportService.saveData(reportDTO);
        });

      //2.从缓存加载配置
      AccountDTO accountDTO = AccountLocalCache.getInstance().get(wifiRequest.getDspId());

      //3.处理参数和URL
      String resultUrl= UrlUtil.handWifiUrl(reportDTO,accountDTO);
      log.info("账户号为{}，完整的{}请求小红书地址为{}",wifiRequest.getDspId(),apiDesc,resultUrl);
       //2.2调用饿了嘛，上报接口
      String body = HttpUtil.createGet(resultUrl).execute().body();
      log.info("账户号为{}，上报{}的小红书接口，响应的结果为{}",wifiRequest.getDspId(),apiDesc,body);
      JSONObject jsonObject=JSONObject.parseObject(body);
      //响应状态码成功
      if(jsonObject.getInteger("code").equals(0)){
          return ResponseEntity.ok(new Result());
      }else{
          return ResponseEntity.status(HttpStatus.BAD_REQUEST).build();
      }
    }


    /**
     * 小红书回传
     * @param click_id 请求参数
     * @return ResponseEntity
     * @throws Exception
     */
    @GetMapping("callback")
    public ResponseEntity callBackUrl(String click_id,String  conv_type,String conv_ts) throws Exception {
         log.info("接收了wifi小红书回调信息，点击ID{},回传类型，回传时间",click_id,conv_type,conv_ts);

         if(StringUtils.isBlank(conv_ts) || StringUtils.isBlank(conv_type)){
             log.info("请求参数异常，event_type{},event_time{]",conv_type,conv_ts);
             return ResponseEntity.status(HttpStatus.BAD_REQUEST).build();
         }

         //1.把转换结果更新到数据库
         Map<String,Object> params=new HashMap<>();
         params.put("bizRequestId",click_id);
         List<ReportDTO> list = reportService.list(params);
         ReportDTO reportDTO;
         if(CollectionUtil.isNotEmpty(list)){
              reportDTO = list.get(0);
              reportDTO.setResultType(conv_type);
              reportDTO.setResultTime(conv_ts);
              reportDTO.setUpdateTime(new Date());
              reportService.updateData(reportDTO,conv_type);
         }else{
             log.error("当前流水号，系统当前不存在");
             return ResponseEntity.status(HttpStatus.BAD_REQUEST).build();
         }

         log.info("从数据库查询的数据为{}",JsonUtils.toJsonString(reportDTO));

        //2.从缓存加载配置
        AccountDTO accountDTO = AccountLocalCache.getInstance().get(reportDTO.getDspId());
        JSONObject jsonObject = JSONObject.parseObject(accountDTO.getSspExtend());
        String clientId = jsonObject.getString("clientid");

        WifiRequest wifiRequest=JsonUtils.parseObject(reportDTO.getExtend(),WifiRequest.class);

        Map<String,Object> paramsReq=new HashMap<>();

        paramsReq.put("cid",wifiRequest.getContentId());
        paramsReq.put("sid",wifiRequest.getSid());
        paramsReq.put("stime",wifiRequest.getStime());
        paramsReq.put("os",wifiRequest.getOs());
        paramsReq.put("idfa",wifiRequest.getIdfaMd5());
        paramsReq.put("mac",wifiRequest.getMacMd5());
        paramsReq.put("imei",wifiRequest.getImeiMd5());
        paramsReq.put("clientid",clientId);
        paramsReq.put("ts",System.currentTimeMillis()/1000);
        paramsReq.put("event_type", WifiEventTypeEnums.getXhsCodeByWifi(conv_type));


        //将参数转换 进行排序转换为url
        String urlParams = UrlUtil.covertParamsOrderByAsc(paramsReq);
        String finalResultUrl=accountDTO.getSspApiUrl()+"?"+urlParams;

        String sign=StringUtils.upperCase(SecureUtil.md5(finalResultUrl+accountDTO.getSspKey()));
        String resultUrl = UrlUtil.handMeitu(finalResultUrl, sign);

         log.info("给{}上报回传结果，完整的URl{}",apiDesc,finalResultUrl);
         HttpRequest body = HttpUtil.createGet(resultUrl);
         String result = body.execute().body();
         log.info("dsp账户ID{}，接收{}转换响应的结果为{}",accountDTO.getId(),apiDesc,result);

         return ResponseEntity.ok(new Result());
   }




}
